home *** CD-ROM | disk | FTP | other *** search
/ The Kara Collection / Kara Collection v3.0 (1996-09-12)(Cloanto).iso / ppaint / rexx / animtext.pprx < prev    next >
Text File  |  1996-08-31  |  10KB  |  470 lines

  1. /* PPaint Amiga Rexx script - Copyright © 1995, 1996 Cloanto Italia srl */
  2.  
  3. /*
  4.   $VER: AnimText.pprx 1.1
  5.  
  6.   This script renders a text string using AnimFonts by Kara Computer
  7.   Graphics. The resulting animation is played or placed in the current
  8.   brush
  9.  
  10.   For more information, or suggestions, please address E-mail to
  11.  
  12.     <info@cloanto.com>
  13. */
  14.  
  15.  
  16. absh_dir = 'KaraCD:PPaint/AnimBrushes/AnimFonts'
  17. data_dir = 'KaraCD:PPaint/AnimBrushes/AnimFonts'
  18.  
  19.  
  20. MYPORT = 'PPAINT'
  21.  
  22. IF ~SHOW('P', MYPORT) THEN DO
  23.     IF EXISTS('PPaint:PPaint') THEN DO
  24.         ADDRESS COMMAND 'Run >NIL: PPaint:PPaint'
  25.         DO 30 WHILE ~SHOW('P',MYPORT)
  26.              ADDRESS COMMAND 'Wait >NIL: 1 SEC'
  27.         END
  28.     END
  29.     ELSE DO
  30.         SAY "Personal Paint could not be loaded."
  31.         EXIT 10
  32.     END
  33. END
  34.  
  35. IF ~SHOW('P', MYPORT) THEN DO
  36.     SAY 'Personal Paint Rexx port could not be opened.'
  37.     EXIT 10
  38. END
  39.  
  40. ADDRESS VALUE MYPORT
  41. OPTIONS RESULTS
  42. OPTIONS FAILAT 10000
  43.  
  44. Version 'REXX'
  45. IF RESULT < 4 THEN DO
  46.     errmess = 'This script requires a newer_version of Personal Paint.'
  47.     SAY errmess
  48.     RequestNotify 'PROMPT="'errmess'"'
  49.     EXIT 10
  50. END
  51.  
  52.  
  53. FreeBrush
  54. IF RC ~= 0 THEN EXIT RC
  55.  
  56. /* Localization */
  57.  
  58. Get 'LANG'
  59. IF RESULT = 1 THEN DO        /* Deutsch */
  60.     req_title    = 'AnimText-Einstellungen'
  61.     lst_gad_txt  = 'Anim_Font:'
  62.     str_gad_txt  = '_Text:'
  63.     str_gad_val  = 'Text'
  64.     cyc_gad_txt  = '_Darstellen:'
  65.     cyc_gad_val1 = 'Von Links nach Rechts'
  66.     cyc_gad_val2 = 'Gleichzeitig'
  67.     num_gad1_txt = 'Ab_stand:'
  68.     num_gad2_txt = 'Einzelbild-_Offset:'
  69.     chk_gad_txt  = 'Anim-_Brush:'
  70.     no_animfont  = 'AnimFonts konnten nicht_gefunden werden'
  71.     no_datafile  = 'Fontdatei konnte nicht_gefunden werden'
  72.     no_env       = 'Andere Umgebung_kann nicht erstellt werden'
  73. END
  74. ELSE IF RESULT = 3 THEN DO    /* Français */
  75.     req_title    = "Réglages d'AnimText"
  76.     lst_gad_txt  = 'Anim_Font :'
  77.     str_gad_txt  = '_Texte :'
  78.     str_gad_val  = 'Texte'
  79.     cyc_gad_txt  = 'Apparitio_n :'
  80.     cyc_gad_val1 = 'De gauche à droite'
  81.     cyc_gad_val2 = 'Simultanément'
  82.     num_gad1_txt = 'E_spacement :'
  83.     num_gad2_txt = '_Retard :'
  84.     chk_gad_txt  = '_Brosse animée :'
  85.     no_animfont  = 'AnimFonts non trouvées'
  86.     no_datafile  = 'Impossible de trouver_le fichier de données_de la police'
  87.     no_env       = "Impossible de créer_l'autre environnement"
  88. END
  89. ELSE IF RESULT = 2 THEN DO    /* Italiano */
  90.     req_title    = 'Parametri AnimText'
  91.     lst_gad_txt  = 'Anim_Font:'
  92.     str_gad_txt  = '_Testo:'
  93.     str_gad_val  = 'Testo'
  94.     cyc_gad_txt  = '_Scrittura:'
  95.     cyc_gad_val1 = 'Da sinistra a destra'
  96.     cyc_gad_val2 = 'Simultanea'
  97.     num_gad1_txt = '_Spaziatura:'
  98.     num_gad2_txt = 'Sp_ostamento:'
  99.     chk_gad_txt  = 'Anim-_Brush:'
  100.     no_animfont  = 'Impossibile trovare AnimFont'
  101.     no_datafile  = 'Impossibile aprire_il file dati'
  102.     no_env       = 'Impossibile creare_ambiente alternativo'
  103. END
  104. ELSE DO                /* English */
  105.     req_title    = 'AnimText Settings'
  106.     lst_gad_txt  = 'Anim_Font:'
  107.     str_gad_txt  = '_Text:'
  108.     str_gad_val  = 'Text'
  109.     cyc_gad_txt  = '_Render:'
  110.     cyc_gad_val1 = 'Left to right'
  111.     cyc_gad_val2 = 'Simultaneously'
  112.     num_gad1_txt = '_Spacing:'
  113.     num_gad2_txt = 'F_rame Offset:'
  114.     chk_gad_txt  = 'Anim-_Brush:'
  115.     no_animfont  = 'AnimFonts not found'
  116.     no_datafile  = 'Font data file_cannot be found'
  117.     no_env       = 'Other environment_cannot be created'
  118. END
  119.  
  120.  
  121.  
  122. /* Build the list of available AnimFonts */
  123.  
  124. ftot = 0
  125. tmpfname = 'T:pprx_temp.'PRAGMA('ID')
  126. ADDRESS COMMAND 'List >'tmpfname' 'absh_dir' NOHEAD LFORMAT="%s" DIRS'
  127. IF RC = 0 THEN DO
  128.     ADDRESS COMMAND 'Sort 'tmpfname tmpfname'.s'
  129.     IF RC = 0 THEN DO
  130.         ADDRESS COMMAND 'Delete >NIL: 'tmpfname
  131.         tmpfname = tmpfname'.s'
  132.     END
  133.     IF OPEN('listfile', tmpfname, R) THEN DO
  134.         DO FOREVER
  135.             fline = READLN('listfile')
  136.             IF EOF('listfile') THEN BREAK
  137.             ftot = ftot + 1
  138.             fontname.ftot = fline
  139.         END
  140.         CALL CLOSE('listfile')
  141.     END
  142. END
  143. ADDRESS COMMAND 'Delete >NIL: 'tmpfname
  144.  
  145. IF ftot = 0 THEN DO
  146.     SAY no_animfont
  147.     RequestNotify 'PROMPT="'no_animfont'"'
  148.     EXIT 10
  149. END
  150.  
  151.  
  152. /* Build and show the settings requester */
  153.  
  154. font = LoadSet('Font', 0)
  155. str_gad_val = LoadSet('Text', str_gad_val)
  156. render  = LoadSet('Render', 0)
  157. spacing = LoadSet('Spacing', 0)
  158. offset  = LoadSet('Offset', 0)
  159. getbsh  = LoadSet('Getbsh', 1)
  160.  
  161. req = '"LIST = ""'lst_gad_txt'"", 'ftot', 'font', 20, 5'  /* max 5 rows to fit into a 320x200 screen */
  162. DO f = 1 TO ftot
  163.     req = req || ', ""' || fontname.f || '""'
  164. END
  165.  
  166. req = req ||,
  167.     ' STRING = ""'str_gad_txt'"", 256, ""'str_gad_val'"" ' ||,
  168.     'CYCLE = ""'cyc_gad_txt'"", 2, 'render', ""'cyc_gad_val1'"", ""'cyc_gad_val2'"" ' ||,
  169.     'INTSTR = ""'num_gad1_txt'"", -32768, 32767, 'spacing' ' ||,
  170.     'INTSTR = ""'num_gad2_txt'"", -32768, 32767, 'offset' ' ||,
  171.     'CHECK = ""'chk_gad_txt'"", 'getbsh' "'
  172.  
  173. Request resize '"'req_title'"' req
  174. IF RC = 0 THEN DO
  175.     font    = RESULT.1
  176.     text    = RESULT.2
  177.     render  = RESULT.3
  178.     spacing = RESULT.4
  179.     offset  = RESULT.5
  180.     getbsh  = RESULT.6
  181.  
  182.     CALL SaveSet('Font', font)        /* setting persistence */
  183.     CALL SaveSet('Text', text)
  184.     CALL SaveSet('Render', render)
  185.     CALL SaveSet('Spacing', spacing)
  186.     CALL SaveSet('Offset', offset)
  187.     CALL SaveSet('Getbsh', getbsh)
  188. END
  189. ELSE EXIT RC
  190.  
  191. font = font + 1
  192. abshpath = absh_dir'/'fontname.font'/'
  193. dataname = data_dir'/'fontname.font'.data'
  194.  
  195. len = LENGTH(text)
  196. fontdata. = 'undef'
  197.  
  198.  
  199.  
  200. /* Read data file */
  201.  
  202. IF OPEN('datafile', dataname, R) THEN DO
  203.     READLN('datafile')
  204.     skip_first = READLN('datafile')
  205.     frm_offset = READLN('datafile')
  206.     DO FOREVER
  207.         fline = READLN('datafile')
  208.         IF EOF('datafile') THEN BREAK
  209.         PARSE VAR fline chr nm spc hdx
  210.         fontdata.name.chr  = nm
  211.         fontdata.space.chr = spc
  212.         fontdata.handx.chr = hdx
  213.     END
  214.     CALL CLOSE('datafile')
  215. END
  216. ELSE DO
  217.     SAY no_datafile
  218.     RequestNotify 'PROMPT="'no_datafile'"'
  219.     EXIT 10
  220. END
  221.  
  222.  
  223.  
  224. /* Render the text */
  225.  
  226. LockGUI
  227.  
  228. Get SETTING IMAGEW
  229. img_width = RESULT
  230. Get SETTING DISPLAY
  231. img_disp = RESULT
  232.  
  233. SwitchEnv
  234. FreeEnv QUERY
  235. IF RC ~= 0 THEN DO
  236.     UnlockGUI
  237.     EXIT RC
  238. END
  239.  
  240. DelFrames ALL FORCE
  241. ClearImage
  242. PaintMode MATTE
  243. xmax = 0
  244. ymax = 0
  245. error = 0
  246. IF render = 0 THEN DO    /* Left to right */
  247.     xpos = 0
  248.     ypos = 0
  249.     first = 1
  250.     DO c = 1 TO len
  251.         chr = UseChar(SUBSTR(text, c, 1))
  252.         IF chr = 32 | chr = 60 | chr = 62 THEN DO
  253.             IF fontdata.space.chr ~= 'undef' THEN
  254.                 xpos = xpos + fontdata.space.chr + spacing
  255.         END
  256.         ELSE DO
  257.             LoadAnimBrush '"'abshpath || fontdata.name.chr'"' FORCE QUIET NOPROGRESS
  258.             IF RC = 0 THEN DO
  259.                 GetBrushAttr FRAMES
  260.                 frm = RESULT
  261.                 IF skip_first THEN
  262.                     frm = frm - 1
  263.  
  264.                 IF first THEN DO
  265.                     first = 0
  266.                     error = SetupEnv(img_width, img_disp)
  267.                     IF error ~= 0 THEN
  268.                         LEAVE c
  269.                     UseBrushPalette
  270.                     IF fontdata.handx.chr > 0 THEN
  271.                         xpos = fontdata.handx.chr
  272.  
  273.                     AddFrames frm
  274.                 END
  275.                 ELSE DO
  276.                     GetFrameNum
  277.                     tot = RESULT
  278.                     pos = tot + frm_offset + offset
  279.                     add = frm - (tot - pos)
  280.                     IF add > 0 THEN
  281.                         AddFrames add AFTER tot
  282.                     SetFramePos pos + 1
  283.                 END
  284.  
  285.                 SetBrushAttr FRPOS 2 HANDLEX fontdata.handx.chr HANDLEY 0
  286.                 DO f = 1 TO frm
  287.                     PutBrush xpos ypos
  288.                     SetFramePos NEXT
  289.                 END
  290.  
  291.                 GetBrushAttr WIDTH
  292.                 x1 = xpos - fontdata.handx.chr + RESULT - 1
  293.                 IF x1 > xmax THEN
  294.                     xmax = x1
  295.                 GetBrushAttr HEIGHT
  296.                 y1 = ypos + RESULT - 1
  297.                 IF y1 > ymax THEN
  298.                     ymax = y1
  299.                 xpos = xpos + fontdata.space.chr + spacing
  300.             END
  301.         END
  302.     END
  303. END
  304. ELSE DO    /* Simultaneously */
  305.     max_frm = 0
  306.     DO c = 1 TO len
  307.         chr = UseChar(SUBSTR(text, c, 1))
  308.         IF chr ~= 32 & chr ~= 60 & chr ~= 62 THEN DO
  309.             LoadAnimBrush '"'abshpath || fontdata.name.chr'"' FORCE QUIET NOPROGRESS
  310.             IF RC = 0 THEN DO
  311.                 GetBrushAttr FRAMES
  312.                 frm = RESULT
  313.                 IF frm > max_frm THEN
  314.                     max_frm = frm
  315.             END
  316.         END
  317.     END
  318.     error = SetupEnv(img_width, img_disp)
  319.     IF error = 0 THEN DO
  320.         IF skip_first THEN
  321.             max_frm = max_frm - 1
  322.         UseBrushPalette
  323.         AddFrames max_frm
  324.  
  325.         DO f = 1 TO max_frm
  326.             xpos = 0
  327.             ypos = 0
  328.             first = 1
  329.             DO c = 1 TO len
  330.                 chr = UseChar(SUBSTR(text, c, 1))
  331.                 IF chr = 32 | chr = 60 | chr = 62 THEN DO
  332.                     IF fontdata.space.chr ~= 'undef' THEN
  333.                         xpos = xpos + fontdata.space.chr + spacing
  334.                 END
  335.                 ELSE DO
  336.                     LoadAnimBrush '"'abshpath || fontdata.name.chr'"' FORCE QUIET NOPROGRESS
  337.                     IF RC = 0 THEN DO
  338.                         GetBrushAttr FRAMES
  339.                         frm = RESULT
  340.  
  341.                         IF first THEN DO
  342.                             first = 0
  343.                             IF fontdata.handx.chr > 0 THEN
  344.                                 xpos = fontdata.handx.chr
  345.                         END
  346.                         fpos = f + 1
  347.                         IF fpos > frm THEN DO
  348.                             IF skip_first THEN
  349.                                 fpos = frm
  350.                             ELSE
  351.                                 fpos = 1
  352.                         END
  353.                         SetBrushAttr FRPOS fpos HANDLEX fontdata.handx.chr HANDLEY 0
  354.                         PutBrush xpos ypos
  355.  
  356.                         IF f = 1 THEN DO
  357.                             GetBrushAttr WIDTH
  358.                             x1 = xpos - fontdata.handx.chr + RESULT - 1
  359.                             IF x1 > xmax THEN
  360.                                 xmax = x1
  361.                             GetBrushAttr HEIGHT
  362.                             y1 = ypos + RESULT - 1
  363.                             IF y1 > ymax THEN
  364.                                 ymax = y1
  365.                         END
  366.                         xpos = xpos + fontdata.space.chr + spacing
  367.                     END
  368.                 END
  369.             END
  370.             SetFramePos NEXT
  371.         END
  372.     END
  373. END
  374.  
  375. IF error = 0 THEN DO
  376.     SetFramePos 1
  377.     IF getbsh THEN DO
  378.         GetFrameNum
  379.         frm = RESULT
  380.         GetRectBrush 0 0 xmax ymax frm
  381.         IF RC = 0 THEN
  382.             FreeEnv FORCE
  383.     END
  384.     ELSE DO
  385.         FreeBrush FORCE
  386.         Play FORCE
  387.     END
  388. END
  389. ELSE DO
  390.     SAY no_env
  391.     RequestNotify 'PROMPT="'no_env'"'
  392. END
  393.  
  394. UnlockGUI
  395. EXIT 0
  396.  
  397.  
  398.  
  399.  
  400. UseChar:
  401.     ch = ARG(1)
  402.  
  403.     code = C2D(ch)
  404.  
  405.     IF fontdata.space.code = 'undef' THEN DO
  406.         IF ch >= 'A' & ch <= 'Z' THEN
  407.             code = code + 32
  408.         ELSE IF ch >= 'a' & ch <= 'z' THEN
  409.             code = code - 32
  410.  
  411.         IF fontdata.space.code = 'undef' THEN
  412.             code = 32
  413.     END
  414.  
  415.     RETURN code
  416.  
  417.  
  418.  
  419.  
  420. SetupEnv:
  421.     imgw = ARG(1)
  422.     imgd = ARG(2)
  423.  
  424.     GetBrushAttr COLORS
  425.     cnum = RESULT
  426.     GetBrushAttr HEIGHT
  427.     imgh = RESULT
  428.  
  429.     Set '"IMAGEW='imgw'" "IMAGEH='imgh'" "COLORS='cnum'" "DISPLAY='imgd'" "SCREENW=-1" "SCREENH='imgh'" "ASCROLL=0"'
  430.  
  431.     RETURN RC
  432.  
  433.  
  434.  
  435.  
  436. SaveSet:
  437.     sname = ARG(1)
  438.     val = ARG(2)
  439.  
  440.     IF OPEN('settingfile', 'ENV:PP_AnimText_'sname, W) THEN DO
  441.         CALL WRITECH('settingfile', val)
  442.         CALL CLOSE('settingfile')
  443.     END
  444.  
  445.     RETURN
  446.  
  447.  
  448.  
  449.  
  450. LoadSet:
  451.     sname = ARG(1)
  452.     def_val = ARG(2)
  453.  
  454.     val = def_val
  455.     IF OPEN('settingfile', 'ENV:PP_AnimText_'sname, R) THEN DO
  456.         val = READCH('settingfile', 65535)
  457.         CALL CLOSE('settingfile')
  458.     END
  459.  
  460.     /* encode quotes for the Request command ('"' -> '\""') */
  461.     qpos_start = 1
  462.     DO FOREVER
  463.         qpos = INDEX(val, '"', qpos_start)
  464.         IF qpos = 0 THEN BREAK
  465.         val = INSERT('\"', val, qpos-1)
  466.         qpos_start = qpos + 3
  467.     END
  468.  
  469.     RETURN val
  470.